package com.dbms;

import java.sql.CallableStatement;
import java.sql.Types;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.Reader;
import java.io.StringReader;
import java.lang.reflect.Method;

import oracle.jdbc.driver.OracleBlobOutputStream;
import oracle.jdbc.driver.OracleClobWriter;
import oracle.sql.BLOB;
import oracle.sql.CLOB;


/**
 * DatabaseManageSystem
 * 主要处理对数据库的查询添加、修改及删除操作
 * 
 * @author yunxiangfu@163.com
 * @version 1.0
 * @since 2009.02.18
 */

public class DatabaseManageSystem
{
	private Connection con=null;						//Connection
	private PreparedStatement ps=null;					//PreparedStatementnvl
	private ResultSet rs=null;							//ResultSet
	private boolean error=false;//异常状态
	//��ݿ�t��
	public DatabaseManageSystem()
	{
	}
	/**
	 * 获得数据库链接
	 * @return 返回数据库链接
	 */
    public synchronized Connection getConnection(){
		if(con==null){
			try{
				Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
				con = DriverManager.getConnection("proxool.connPool");
				
				/*Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
				Properties info = new Properties();
				info.setProperty("proxool.maximum-connection-count", "10");
				info.setProperty("proxool.house-keeping-test-sql", "select CURRENT_DATE");
				info.setProperty("user", "iosef");
				info.setProperty("password", "iosef");
				String alias = "test";
				String driverClass = "oracle.jdbc.driver.OracleDriver";
				String driverUrl = "jdbc:oracle:thin:@192.168.0.104:1521:happy";
				String url = "proxool." + alias + ":" + driverClass + ":" + driverUrl;
				ProxoolFacade.registerConnectionPool(url, info); 
				con = DriverManager.getConnection("proxool.test");
				*/
				
				con.setAutoCommit(false);//
			}catch(Exception e)
			{
				e.printStackTrace();
			}
		}else{
			close();
		}
        return con;
    }
    /**
     * 该方法主要返回查询后的数据以列表返回</br>
     * 
     * @param sql SQL查询语句
     * @param listToType List中所存放对象的Class
     * 					(java.util.LinkedList.class|com.dbms.Hashtable.class|com.perform.util.DatabaseRow.class|用户自定义Bean.class)
     * @param isString 是否强制已getString方式读取
     * @param isPrint 是否打印SQL语句
     * @param isClose 执行后是否释放数据库链接
     * @return List<?> 返回List对象，List中所存储的对象为listToType
     */
	public List<?> getList(String sql,Class<?> listToType,boolean isString,boolean isPrint,boolean isClose)
	{
		getConnection();
		if(con==null){
			closeAll();
			return null;
		}
		List<?> list=null;
		try{
			if(isPrint)
				System.out.println("select:"+sql);
			ps=con.prepareStatement(sql);
			rs=ps.executeQuery();
			list=getList(rs,listToType,isString);//获得数据
		}catch(Exception ex){
			error=true;//异常状态
			ex.printStackTrace();
		}finally{
			if(isClose || error)
				closeAll();
			else
				close();
		}
		return list;
	}
    /**
     * 该方法主要适用于查询单条数据已指定数据类型返回
     * 
     * @param sql SQL查询语句
     * @param toType 返回后的对象类型
     * @param isString 是否强制已getString方式读取
     * @param isPrint 是否打印SQL语句
     * @param isClose 执行后是否释放数据库链接
     * @return Object 返回toType所指定的对象
     */
	public Object getObject(String sql,Class<?> toType,boolean isString,boolean isPrint,boolean isClose)
	{
		getConnection();
		if(con==null){
			closeAll();
			return null;
		}
		Object body = null;
		try{
			if(isPrint)
				System.out.println("select:"+sql);
			ps=con.prepareStatement(sql);
			rs=ps.executeQuery();

			ResultSetMetaData rmd = rs.getMetaData();
			int columncount = rmd.getColumnCount();
			if(toType==java.util.LinkedList.class){//LinkedList
				if(rs.next())
				{
					Object info = null;
					LinkedList<Object> ll=new LinkedList<Object>();
					for(int i=1;i<=columncount;i++){
						info=getData(rs,i,rmd.getColumnType(i),isString);//获得数据
						if(info==null)
							info="";
						ll.add(info);
					}
					body=ll;
				}
			}else if(toType==com.dbms.Hashtable.class){//Hashtable
				Object info=null;
				if(rs.next())
				{
					Hashtable<String,Object> h=new Hashtable<String, Object>();
					for(int i=1;i<columncount+1;i++){
						String name=rmd.getColumnName(i);
						info=getData(rs,i,rmd.getColumnType(i),isString);//获得数据
						if(info==null)
							info="";
						h.put(name, info);
					}
					body=h;
				}
			}else if(toType==DatabaseRow.class){//通用Bean
				Object info=null;
				if(rs.next())
				{
					Object o=toType.newInstance();
					for(int i=1;i<columncount+1;i++){
						info=getData(rs,i,rmd.getColumnType(i),isString);//获得数据
						if(info==null)
							info="";
						Method m=toType.getMethod(new StringBuilder("setRow").append(i).toString(),java.lang.Object.class);
						m.invoke(o, info);//为通用Bean赋值
					}
					body=o;
				}
			}else{//用户自定义Bean
				Object info=null;
				if(rs.next())
				{
					Object o=toType.newInstance();
					for(int i=1;i<columncount+1;i++){
						int types=rmd.getColumnType(i);//字段数据类型
						String name=rmd.getColumnName(i);//字段名称
						//System.out.println("index="+i+" class="+rmd.getColumnClassName(i));
						info=getData(rs,i,rmd.getColumnType(i),isString);//获得数据
						setBean(toType,o,types,name,info,isString);//为Bean赋值
					}
					body=o;
				}
			}
		}catch(Exception ex){
			error=true;//异常状态
			ex.printStackTrace();
		}finally{
			if(isClose || error)
				closeAll();
			else
				close();
		}
		return body;
	}
	/**
	 * 单条数据查询并对指定对象赋值
     * 
     * @param sql SQL查询语句
     * @param toObject 需要赋值的对象
     * @param isString 是否强制已getString方式读取
     * @param isPrint 是否打印SQL语句
     * @param isClose 执行后是否释放数据库链接
	 */
	public void getToObject(String sql,Object toObject,boolean isString,boolean isPrint,boolean isClose)
	{
		getConnection();
		if(con==null){
			closeAll();
		}
		try{
			if(isPrint)
				System.out.println("select:"+sql);
			ps=con.prepareStatement(sql);
			rs=ps.executeQuery();
			ResultSetMetaData rmd = rs.getMetaData();
			int columncount = rmd.getColumnCount();
			Object info=null;
			if(rs.next())
			{
				for(int i=1;i<columncount+1;i++){
					int types=rmd.getColumnType(i);//字段数据类型
					String name=rmd.getColumnName(i);//字段名称
					//System.out.println("index="+i+" class="+rmd.getColumnClassName(i));
					info=getData(rs,i,rmd.getColumnType(i),isString);//获得数据
					setBean(toObject.getClass(),toObject,types,name,info,isString);//为Bean赋值
				}
			}
		}catch(Exception ex){
			error=true;//异常状态
			ex.printStackTrace();
		}finally{
			if(isClose || error)
				closeAll();
			else
				close();
		}
	}
	/**
     * 该方法主要适用于分页查询返回指定类型的List列表
     * 
     * @param sql 查询语句
     * @param page 分页对象
     * @param listToType List中所存放对象的Class
     * 					(java.util.LinkedList.class|com.dbms.Hashtable.class|com.perform.util.DatabaseRow.class|用户自定义Bean.class)
     * @param isString 是否强制已getString方式读取
     * @param isPrint 是否打印SQL语句
     * @param isClose 执行后是否释放数据库链接
     * @return List<?> 返回List对象，List中所存储的对象为listToType
     */
	public List<?> getList(String sql,Pages page,Class<?> listToType,boolean isString,boolean isPrint,boolean isClose)
	{
		getConnection();
		if(con==null){
			closeAll();
			return null;
		}
		List<?> list = null;
		try{
			//获得数据总数
			StringBuilder countSql=new StringBuilder();
			countSql.append("select count(*) from (").append(sql).append(")");
			if(isPrint){//打印
				System.out.println("countSql:"+countSql.toString());
			}
			ps=con.prepareStatement(countSql.toString());
			rs=ps.executeQuery();
			int count=0;
			while(rs.next()){
				count=rs.getInt(1);
			}
			close();//关闭rs.close()链接
			page.setItems(count);//查询数目
			//分页查询语句
			StringBuilder pageSql=new StringBuilder();
			pageSql.append("select * from (select t.*, rownum counts from(").append(sql).append(")t)");
			pageSql.append(" where counts between ");
			pageSql.append(page.getOffset());
			pageSql.append(" and ");
			pageSql.append((page.getOffset()+page.getMaxPageItems()-1));
			if(isPrint)
				System.out.println("pageSql:"+pageSql.toString());
			ps=con.prepareStatement(pageSql.toString());
			rs=ps.executeQuery();
			list=getList(rs,listToType,isString);//获得数据
//			page.setOffset(0);//设置分页偏移量
		}catch(Exception ex){
			error=true;//异常状态
			ex.printStackTrace();
		}finally{
			if(isClose || error)
				closeAll();
			else
				close();
		}
		return list;
	}
	/**
     * 该方法主要适用于分页查询返回指定类型的List列表
     * 
     * @param sql 查询语句
     * @param page 分页对象
     * @param listToType List中所存放对象的Class
     * 					(java.util.LinkedList.class|com.dbms.Hashtable.class|com.perform.util.DatabaseRow.class|用户自定义Bean.class)
     * @param isString 是否强制已getString方式读取
     * @param isPrint 是否打印SQL语句
     * @param isClose 执行后是否释放数据库链接
     * @return List<?> 返回List对象，List中所存储的对象为listToType
     */
	public List<?> getCallPageList(String sql,Pages page,Class<?> listToType,boolean isString,boolean isPrint,boolean isClose)
	{
		List<?> list = null;
		CallParameterList body=new CallParameterList();//存储过程参数类
		body.add(sql);//sql代码	1
		body.add(page.getMaxPageItems());//每页显示行数		2
		body.add(page.getNoncePage());//当前页数		3
		body.add(oracle.jdbc.driver.OracleTypes.NUMBER,null,true);//总行数	4
		body.add(oracle.jdbc.driver.OracleTypes.NUMBER,null,true);//总页数	5
		body.add(oracle.jdbc.driver.OracleTypes.CURSOR,listToType,isString);//游标记录集	6
		java.util.Vector<Object> v=(java.util.Vector<Object>) getCall("P_QuerySplit", body, true, true);//调用存储过程
		if(v!=null){
			int items=(Integer)v.get(0);//总行数
			int pages=(Integer)v.get(1);//总页数
			page.setItems(items);//修改数据总数
			list=(List<?>)v.get(2);//获得结果集数据
		}
		return list;
	}
	/**
	 * 根据指定类型获得数据
	 * @param rs 结果集
	 * @param index 字段索引
	 * @param types 数据类型
	 * @param isString 是否已String方式获取
	 * @return 获得结果集数据
	 * @throws SQLException
	 */
	private Object getData(ResultSet rs,int index,int types,boolean isString) throws SQLException{
		Object data = null;
		if(isString){//已String方式获得
			switch(types)
			{
				case Types.BLOB:
					data=SQLTool.blobToString(rs.getBlob(index));
					data=data==null?"":data;
					break;
				case Types.CLOB:
					data=SQLTool.clobToString(rs.getClob(index));
					break;
				case Types.VARCHAR:
					data=rs.getString(index);
					data=data==null?"":data;
					break;
				case Types.NULL:
					data="";
					break;
				default:
					data=rs.getString(index);
					data=data==null?"":data;
			}
		}else{//已实际数据类型方式获得
			switch(types)
			{
				case Types.ARRAY:
					data=rs.getArray(index);
					break;
				case Types.BLOB:
					data=SQLTool.blobToBytes(rs.getBlob(index));//to byte[]
					break;
				case Types.CLOB:
					data=SQLTool.clobToString(rs.getClob(index));//to String
					data=data==null?"":data;
					break;
				case Types.DATE:
					data=rs.getDate(index)==null?null:new Date(rs.getDate(index).getTime());
					break;
				case Types.DOUBLE:
					data=rs.getDouble(index);
					break;
				case Types.FLOAT:
					data=rs.getFloat(index);
					break;
				case Types.INTEGER:
					data=rs.getInt(index);
					break;
				case Types.NUMERIC:
					data=rs.getBigDecimal(index);
					break;
				case Types.VARCHAR:
					data=rs.getString(index);
					data=data==null?"":data;
					break;
				case Types.BIT:
					data=rs.getBoolean(index);
					break;
				case Types.NULL:
					data="";
					break;
				default:
					data=rs.getString(index);
					data=data==null?"":data;
			}
		}
		return data;
	}
	/**
	 * 为用户Bean赋值
	 * @param listToType 赋值对象的Class
	 * @param ojb 赋值的对象
	 * @param types java.sql.Types数据类型
	 * @param name 字段名称
	 * @param info 数据值
	 * @param isString 数据类型是否为String
	 * @throws Exception
	 */
	private void setBean(Class<?> listToType,Object ojb,int types,String name,Object info,boolean isString) throws Exception{
		if(isString){//String
			BeanTool.setBean(listToType, ojb, new StringBuilder("set").append(name).toString(), info);//
		}else{
			if(Types.NUMERIC==types){//java.math.BigDecimal类型
				//System.out.println("NUMBER=="+info+" type=="+types);
				java.math.BigDecimal decimal=(java.math.BigDecimal)info;
				/*
				 * @see     java.lang.Byte
				 * @see     java.lang.Double
				 * @see     java.lang.Float
				 * @see     java.lang.Integer
				 * @see     java.lang.Long
				 * @see     java.lang.Short
				 */
				if(decimal!=null){
					BeanTool.setBeanBigDecimal(listToType, ojb, new StringBuilder("set").append(name).toString(), decimal);
//					if(!BeanTool.setBean(listToType, ojb, new StringBuilder("set").append(name).toString(), decimal.doubleValue()))//double
//						if(!BeanTool.setBean(listToType, ojb, new StringBuilder("set").append(name).toString(), decimal.floatValue()))//float
//							if(!BeanTool.setBean(listToType, ojb, new StringBuilder("set").append(name).toString(), decimal.longValue()))//long
//								if(!BeanTool.setBean(listToType, ojb, new StringBuilder("set").append(name).toString(), decimal.intValue()))//int
//									if(!BeanTool.setBean(listToType, ojb, new StringBuilder("set").append(name).toString(), decimal.shortValue()))//short
//										BeanTool.setBean(listToType, ojb, new StringBuilder("set").append(name).toString(), decimal.byteValue());//byte
				}
			}else if(Types.BIT==types){//Boolean类型
				BeanTool.setBean(listToType, ojb, new StringBuilder("is").append(name).toString(), info);//
			}else if(Types.BOOLEAN==types){//Boolean类型
				BeanTool.setBean(listToType, ojb, new StringBuilder("is").append(name).toString(), info);//
			}else{
				BeanTool.setBean(listToType, ojb, new StringBuilder("set").append(name).toString(), info);//
			}
		}
	}
    /**
     * 该方法主要用于内部使用,返回指定类型的List列表
     * 
     * @param listToType List中所存放对象的Class
     * 					(java.util.LinkedList.class|com.dbms.Hashtable.class|com.perform.util.DatabaseRow.class|用户自定义Bean.class)
     * @param isString 是否强制已getString方式读取
     * @return List<?> 返回List对象，List中所存储的对象为listToType
     */
	private List<?> getList(ResultSet rs,Class<?> listToType,boolean isString) throws Exception{
		ResultSetMetaData rmd = rs.getMetaData();
		int columncount = rmd.getColumnCount();
		if(listToType==java.util.LinkedList.class){//LinkedList
			List<LinkedList> list = new ArrayList<LinkedList>();
			Object info = null;
			while(rs.next())
			{
				LinkedList<Object> ll=new LinkedList<Object>();
				for(int i=1;i<=columncount;i++){
					info=getData(rs,i,rmd.getColumnType(i),isString);//获得数据
					if(info==null)
						info="";
					ll.add(info);
				}
				list.add(ll);
			}
			return list;
		}else if(listToType==com.dbms.Hashtable.class){//Hashtable
			List<Hashtable> list = new ArrayList<Hashtable>();
			Object info=null;
			while(rs.next())
			{
				Hashtable<String,Object> h=new Hashtable<String, Object>();
				for(int i=1;i<columncount+1;i++){
					String name=rmd.getColumnName(i);
					info=getData(rs,i,rmd.getColumnType(i),isString);//获得数据
					if(info==null)
						info="";
					h.put(name, info);
				}
				list.add(h);
			}
			return list;
		}else if(listToType==DatabaseRow.class){//DatabaseRow
			List<DatabaseRow> list = new ArrayList<DatabaseRow>();
			Object info=null;
			while(rs.next())
			{
				Object o=listToType.newInstance();
				for(int i=1;i<columncount+1;i++){
					info=getData(rs,i,rmd.getColumnType(i),isString);//获得数据
					if(info==null)
						info="";
					Method m=listToType.getMethod(new StringBuilder("setRow").append(i).toString(),java.lang.Object.class);
					m.invoke(o, info);
				}
				list.add((DatabaseRow)o);
			}
			return list;
		}else{//用户自定义Bean
			List<Object> list = new ArrayList<Object>();
			Object info=null;
			while(rs.next())
			{
				Object o=listToType.newInstance();
				for(int i=1;i<columncount+1;i++){
					int types=rmd.getColumnType(i);//字段数据类型
					String name=rmd.getColumnName(i);//字段名称
					info=getData(rs,i,rmd.getColumnType(i),isString);//获得数据
					setBean(listToType,o,types,name,info,isString);//为Bean赋值
				}
				list.add(o);
			}
			return list;
		}
	}
    /**
     * 该方法主要适用于查询结果为单个整数
     * 
     * @param sql 查询语句
     * @param isPrint 是否打印查询语句
     * @return close 执行后是释放数据库连接
     */
	public int getNumber(String sql,boolean isPrint,boolean isClose)
	{
		getConnection();
		if(con==null){
			closeAll();
			return 0;
		}
		int number = 0;
		if(isPrint)//是否打印Sql语句
			System.out.println("select:"+sql);
		try{
			ps=con.prepareStatement(sql);
			rs=ps.executeQuery();
			if(rs.next())
				number = rs.getInt(1);
		}catch(Exception ex){
			error=true;//异常状态
			ex.printStackTrace();
		}finally{
			if(isClose || error)
				closeAll();
			else
				close();
		}
		return number;
	}
	/**
	 * 获得表字段集合
	 * @param table	字名
	 * @param isClose 是否关闭数据库
	 * @return 返回字段集合
	 */
	private List<TableColumn> getTable(String table,boolean isClose){
		getConnection();
		if(con==null){
			closeAll();
		}
		List<TableColumn> columns = new ArrayList<TableColumn>();
		try{
			StringBuilder sql=new StringBuilder();
			sql.append("select COLUMN_NAME,DATA_TYPE,NULLABLE");//字段名称，字段类型，字段大小
			sql.append(" from user_tab_columns");
			sql.append(" where table_name='").append(table.toUpperCase()).append("'");
//			System.out.println(sql.toString());
			ps=con.prepareStatement(sql.toString());
			rs=ps.executeQuery();
			while(rs.next())
			{
				String name=rs.getString(1);
				String type=rs.getString(2);
				String nullAble=rs.getString(3);
				boolean isNull="Y".equals(nullAble);
				columns.add(new TableColumn(name,type,isNull));
			}
		}catch(Exception ex){
			error=true;//异常状态
			ex.printStackTrace();
		}finally{
			if(isClose || error)
				closeAll();
			else
				close();
		}
		return columns;
	}
    /**
     * 将对象插入数据库,支持数据回滚操作
     * 
     * @param table 表名
	 * @param obj 需要插入的对象
     * @param body 添加的数据项
     * @param isPrint 是否打印SQL语句
     * @param isCommit 是否提交事务(对操作处理失败后进行回滚操作)
     * @param isClose 执行后是释放数据库连接
     * @return boolean 返回执行后的结果
     */
	public synchronized boolean insertObject(String table,Object obj,DatabaseParameterList body,boolean isPrint,boolean isCommit,boolean isClose)
	{
		getConnection();
		if(con==null){
			closeAll();
			return false;
		}
		StringBuilder parameter=new StringBuilder();//参数
		StringBuilder sql=new StringBuilder();//插入语句
		sql.append("insert into ").append(table).append("(");
		List<TableColumn> tableColumns = getTable(table,false);//获得表字段集合
		int sum=0;
		if(body!=null){
			for(int i=0;i<body.size();i++)
			{
				DatabaseParameter cp=body.get(i);
				if(i==0 && sum==0){
					sql.append(cp.getKey());//字段名
					if(cp.isAction())//是否直接赋值
						parameter.append(cp.getValue());//为该字段直接值
					else
						parameter.append("?");//加参数
				}else{
					sql.append(",").append(cp.getKey());//字段名
					if(cp.isAction())//是否直接赋值
						parameter.append(",").append(cp.getValue());//为该字段直接值
					else
						parameter.append(",?");//加参数
				}
				sum++;
			}
		}
		for(TableColumn column:tableColumns){
			Object value=BeanTool.getBean(obj, new StringBuilder("get").append(column.getColumnName()).toString());
//			System.out.println("key="+column.getColumnName()+" value="+value);
			if(value!=null && !(body!=null && body.get(column.getColumnName())!=null)){
				if(sum==0){
					sql.append(column.getColumnName());//字段名
					column.setInsertAction(true);//设置为插入动作
					parameter.append("?");//加参数
				}else{
					sql.append(",").append(column.getColumnName());//字段名
					parameter.append(",?");//加参数
				}
				sum++;
			}
		}
		sql.append(")values(").append(parameter).append(")");
		if(isPrint)//是否打印语句
			System.out.println(sql.toString());
		int result=0;
		try{
			ps=con.prepareStatement(sql.toString());
			int n=1;
			//通过DatabaseParameterList赋值
			if(body!=null){
				for(int i=0;i<body.size();i++){
					DatabaseParameter p=body.get(i);
					if(!p.isAction()){//不需要参数赋值
						statementSet(ps,n,p.getValue(),p.getType());//参数赋值
						if(isPrint)//是否打印语句
							System.out.println("statementSet("+n+","+p.getValue()+")");
						n++;
					}
				}
			}
			//通过对象赋值
			for(TableColumn column:tableColumns){
				Object value=BeanTool.getBean(obj, new StringBuilder("get").append(column.getColumnName()).toString());
				if(value!=null && !(body!=null && body.get(column.getColumnName())!=null)){
					statementSet(ps,n,value,SQLTool.getObjectType(value));//参数赋值
					if(isPrint)//是否打印语句
						System.out.println("statementSet("+n+","+value.toString()+")");
					n++;
				}
			}
			result=ps.executeUpdate();
			if (result >= 1){
				if(isCommit)//是否提交事务
					con.commit();//成功则提交
			}
			else
				con.rollback();//失败则回滚
		}catch(Exception ex){
			error=true;//异常状态
			ex.printStackTrace();
		}finally{
			if(isClose && isCommit || error)
				closeAll();
			else
				close();
		}
		return result>0;
	}
    /**
     * 将数据插入数据库(不推荐使用)
     * 
     * @param table 表名
     * @param body 添加的数据项
     * @param isPrint 是否打印SQL语句
     * @param isClose 执行后是释放数据库连接
     * @return boolean 返回执行后的结果
     */
    @java.lang.Deprecated
	public synchronized boolean insert(String table,DatabaseParameterList body,boolean isPrint,boolean isClose)
	{
		getConnection();
		if(con==null){
			closeAll();
			return false;
		}
		StringBuilder parameter=new StringBuilder();//参数
		StringBuilder sql=new StringBuilder();//插入语句
		sql.append("insert into ").append(table).append("(");
		for(int i=0;i<body.size();i++)
		{
			DatabaseParameter cp=body.get(i);
			if(i==0){
				sql.append(cp.getKey());//字段名
				if(cp.isAction())//是否直接赋值
					parameter.append(cp.getValue());//为该字段直接值
				else
					parameter.append("?");//加参数
			}else{
				sql.append(",").append(cp.getKey());//字段名
				if(cp.isAction())//是否直接赋值
					parameter.append(",").append(cp.getValue());//为该字段直接值
				else
					parameter.append(",?");//加参数
			}
		}
		sql.append(")values(").append(parameter).append(")");
		if(isPrint)//是否打印语句
			System.out.println(sql.toString());
		int result=0;
		try{
			ps=con.prepareStatement(sql.toString());
			int n=1;
			for(int i=0;i<body.size();i++){
				DatabaseParameter p=body.get(i);
				if(!p.isAction()){//不需要参数赋值
					statementSet(ps,n,p.getValue(),p.getType());//参数赋值
					if(isPrint)//是否打印语句
						System.out.println("statementSet("+n+","+p.getValue()+")");
					n++;
				}
			}
			result=ps.executeUpdate();
			if (result >= 1) 
				con.commit();//成功则提交
			else
				con.rollback();//失败则回滚
		}catch(Exception ex){
			error=true;//异常状态
			ex.printStackTrace();
		}finally{
			if(isClose || error)
				closeAll();
			else
				close();
		}
		return result>0;
	}
    /**
     * 将数据插入数据库,添加了数据回滚操作
     * 
     * @param table 表名
     * @param body 添加的数据项
     * @param isPrint 是否打印SQL语句
     * @param isCommit 是否提交事务(对操作处理失败后进行回滚操作)
     * @param isClose 执行后是释放数据库连接
     * @return boolean 返回执行后的结果
     */
	public synchronized boolean insert(String table,DatabaseParameterList body,boolean isPrint,boolean isCommit,boolean isClose)
	{
		getConnection();
		if(con==null){
			closeAll();
			return false;
		}
		StringBuilder parameter=new StringBuilder();//参数
		StringBuilder sql=new StringBuilder();//插入语句
		sql.append("insert into ").append(table).append("(");
		for(int i=0;i<body.size();i++)
		{
			DatabaseParameter cp=body.get(i);
			if(i==0){
				sql.append(cp.getKey());//字段名
				if(cp.isAction())//是否直接赋值
					parameter.append(cp.getValue());//为该字段直接值
				else
					parameter.append("?");//加参数
			}else{
				sql.append(",").append(cp.getKey());//字段名
				if(cp.isAction())//是否直接赋值
					parameter.append(",").append(cp.getValue());//为该字段直接值
				else
					parameter.append(",?");//加参数
			}
		}
		sql.append(")values(").append(parameter).append(")");
		if(isPrint)//是否打印语句
			System.out.println(sql.toString());
		int result=0;
		try{
			ps=con.prepareStatement(sql.toString());
			int n=1;
			for(int i=0;i<body.size();i++){
				DatabaseParameter p=body.get(i);
				if(!p.isAction()){//不需要参数赋值
					statementSet(ps,n,p.getValue(),p.getType());//参数赋值
					if(isPrint)//是否打印语句
						System.out.println("statementSet("+n+","+p.getValue()+")");
					n++;
				}
			}
			result=ps.executeUpdate();
			if (result >= 1){
				if(isCommit)//是否提交事务
					con.commit();//成功则提交
			}
			else
				con.rollback();//失败则回滚
		}catch(Exception ex){
			error=true;//异常状态
			ex.printStackTrace();
		}finally{
			if(isClose && isCommit || error)
				closeAll();
			else
				close();
		}
		return result>0;
	}
    /**
     * 更新数据库中的数据(不推荐使用)
     * 
     * @param table 表名
     * @param body 更新的数据项
     * @param where 查询条件
     * @param isPrint 是否打印SQL语句
     * @param isClose 执行后是释放数据库连接
     * @return boolean 返回执行后的结果
     */
    @java.lang.Deprecated
	public synchronized boolean update(String table,DatabaseParameterList body,String where,boolean isPrint,boolean isClose)
	{
		getConnection();
		if(con==null){
			closeAll();
			return false;
		}
		StringBuilder sql=new StringBuilder();//插入语句���SQL���
		sql.append("update ").append(table);
		sql.append(" set ");
		for(int i=0;i<body.size();i++)
		{
			DatabaseParameter p=body.get(i);
			if(i==0){
				if(p.isAction())//是否直接赋值
					sql.append(p.getKey()).append("=").append(p.getValue());//直接赋值
				else
					sql.append(p.getKey()).append("=?");//参数赋值
			}else{
				sql.append(",");
				if(p.isAction())//是否直接赋值
					sql.append(p.getKey()).append("=").append(p.getValue());//直接赋值
				else
					sql.append(p.getKey()).append("=?");//参数赋值
			}
		}
		sql.append(" where ").append(where);
		if(isPrint)//是否打印语句
			System.out.println(sql.toString());
		int result=0;
		try{
			ps=con.prepareStatement(sql.toString());
			int n=1;
			for(int i=1;i<=body.size();i++){
				DatabaseParameter p=body.get(i-1);
				if(!p.isAction()){//不需要参数赋值
					statementSet(ps,n,p.getValue(),p.getType());//参数赋值
					if(isPrint)//是否打印语句
						System.out.println("statementSet("+n+","+p.getValue()+")");
					n++;
				}
			}
			result=ps.executeUpdate();
			if (result >= 1) 
				con.commit();//成功则提交
			else
				con.rollback();//失败则回滚
		}catch(Exception ex){
			error=true;//异常状态
			ex.printStackTrace();
		}finally{
			if(isClose || error)
				closeAll();
			else
				close();
		}
		return result >= 1;
	}
    /**
     * 更新数据库中的数据，添加了数据回滚操作
     * 
     * @param table 表名
     * @param body 更新的数据项
     * @param where 查询条件
     * @param isPrint 是否打印SQL语句
     * @param isCommit 是否提交事务(对操作处理失败后进行回滚操作)
     * @param isClose 执行后是释放数据库连接
     * @return boolean 返回执行后的结果
     */
	public synchronized boolean update(String table,DatabaseParameterList body,String where,boolean isPrint,boolean isCommit,boolean isClose)
	{
		getConnection();
		if(con==null){
			closeAll();
			return false;
		}
		StringBuilder sql=new StringBuilder();//插入语句���SQL���
		sql.append("update ").append(table);
		sql.append(" set ");
		for(int i=0;i<body.size();i++)
		{
			DatabaseParameter p=body.get(i);
			if(i==0){
				if(p.isAction())//是否直接赋值
					sql.append(p.getKey()).append("=").append(p.getValue());//直接赋值
				else
					sql.append(p.getKey()).append("=?");//参数赋值
			}else{
				sql.append(",");
				if(p.isAction())//是否直接赋值
					sql.append(p.getKey()).append("=").append(p.getValue());//直接赋值
				else
					sql.append(p.getKey()).append("=?");//参数赋值
			}
		}
		sql.append(" where ").append(where);
		if(isPrint)//是否打印语句
			System.out.println(sql.toString());
		int result=0;
		try{
			ps=con.prepareStatement(sql.toString());
			int n=1;
			for(int i=1;i<=body.size();i++){
				DatabaseParameter p=body.get(i-1);
				if(!p.isAction()){//不需要参数赋值
					statementSet(ps,n,p.getValue(),p.getType());//参数赋值
					if(isPrint)//是否打印语句
						System.out.println("statementSet("+n+","+p.getValue()+")");
					n++;
				}
			}
			result=ps.executeUpdate();
			if (result >= 1){
				if(isCommit)//是否提交事务
					con.commit();//成功则提交
			}
			else
				con.rollback();//失败则回滚
		}catch(Exception ex){
			error=true;//异常状态
			ex.printStackTrace();
		}finally{
			if(isClose && isCommit || error)
				closeAll();
			else
				close();
		}
		return result >= 1;
	}
    /**
     * 根据对象更新数据库中的数据，支持数据回滚操作
     * 
     * @param table 表名
     * @param obj 所要更新的对象
     * @param body 更新的数据项
     * @param where 查询条件
     * @param isPrint 是否打印SQL语句
     * @param isCommit 是否提交事务(对操作处理失败后进行回滚操作)
     * @param isClose 执行后是释放数据库连接
     * @return boolean 返回执行后的结果
     */
	public synchronized boolean updateObject(String table,Object obj,DatabaseParameterList body,String where,boolean isPrint,boolean isCommit,boolean isClose)
	{
		getConnection();
		if(con==null){
			closeAll();
			return false;
		}
		List<TableColumn> tableColumns = getTable(table,false);//获得表字段集合
		StringBuilder sql=new StringBuilder();//插入语句���SQL���
		sql.append("update ").append(table);
		sql.append(" set ");
		int sum=0;
		if(body!=null){
			for(int i=0;i<body.size();i++)
			{
				DatabaseParameter p=body.get(i);
				if(i==0){
					if(p.isAction())//是否直接赋值
						sql.append(p.getKey()).append("=").append(p.getValue());//直接赋值
					else
						sql.append(p.getKey()).append("=?");//参数赋值
				}else{
					sql.append(",");
					if(p.isAction())//是否直接赋值
						sql.append(p.getKey()).append("=").append(p.getValue());//直接赋值
					else
						sql.append(p.getKey()).append("=?");//参数赋值
				}
				sum++;
			}
		}
		for(TableColumn column:tableColumns){
			Object value=BeanTool.getBean(obj, new StringBuilder("get").append(column.getColumnName()).toString());
//			System.out.println("key="+column.getColumnName()+" value="+value);
			if(value!=null && !(body!=null && body.get(column.getColumnName())!=null)){
				if(sum==0){
					sql.append(column.getColumnName()).append("=?");//字段名
					column.setInsertAction(true);//设置为插入动作
					
				}else{
					sql.append(",").append(column.getColumnName()).append("=?");//字段名
				}
				sum++;
			}
		}
		sql.append(" where ").append(where);
		if(isPrint)//是否打印语句
			System.out.println(sql.toString());
		int result=0;
		try{
			ps=con.prepareStatement(sql.toString());
			int n=1;
			//通过DatabaseParameterList赋值
			if(body!=null){
				for(int i=1;i<=body.size();i++){
					DatabaseParameter p=body.get(i-1);
					if(!p.isAction()){//不需要参数赋值
						statementSet(ps,n,p.getValue(),p.getType());//参数赋值
						if(isPrint)//是否打印语句
							System.out.println("statementSet("+n+","+p.getValue()+")");
						n++;
					}
				}
			}
			//通过对象赋值
			for(TableColumn column:tableColumns){
				Object value=BeanTool.getBean(obj, new StringBuilder("get").append(column.getColumnName()).toString());
				if(value!=null && !(body!=null && body.get(column.getColumnName())!=null)){
					statementSet(ps,n,value,SQLTool.getObjectType(value));//参数赋值
					if(isPrint)//是否打印语句
						System.out.println("statementSet("+n+","+value+")");
					n++;
				}
			}
			result=ps.executeUpdate();
			if (result >= 1){
				if(isCommit)//是否提交事务
					con.commit();//成功则提交
			}
			else
				con.rollback();//失败则回滚
		}catch(Exception ex){
			error=true;//异常状态
			ex.printStackTrace();
		}finally{
			if(isClose && isCommit || error)
				closeAll();
			else
				close();
		}
		return result >= 1;
	}
	/**
	 * 更新单个Clob字段(不推荐使用)
	 * @param row 字段名
	 * @param table 表名
	 * @param where 查询条件
	 * @param text 所要更新的数据
	 * @param isClose 是否关闭数据库
	 * @param isCommit 是否提交事务
	 * @return 返回成功结果
	 */
	@java.lang.Deprecated
	public boolean updateClob(String row,String table,String where,String text,boolean isClose,boolean isCommit){
		getConnection();
		if(con==null)
			return false;
		boolean result=false;
		try{
			String sql="update "+table+" set "+row+"=empty_clob() where "+where;
			ps = con.prepareStatement(sql);
			ps.executeUpdate();
			sql="select "+row+" from "+table+" where "+where+"";
//			sql="select "+row+" from "+table+" where "+where+" for update";//注：如果应用此方法就不需要单独update更新，但在更新CLOB字段时只是按位置替换不会替换整个CLOB内容
			ps = con.prepareStatement(sql);
//			Statement st = conn.createStatement();
			ResultSet rs = ps.executeQuery();
			if(rs.next()){
				//OracleJDBC处理方法
				oracle.sql.CLOB clob = (CLOB) ((oracle.jdbc.OracleResultSet)rs).getClob(1);
				//Tomcat链接池CLOB处理方法
//				oracle.sql.CLOB clob = (CLOB) ((org.apache.tomcat.dbcp.dbcp.DelegatingResultSet)rs).getClob(1);
				oracle.jdbc.driver.OracleClobWriter writer=(OracleClobWriter) clob.getCharacterOutputStream();
				BufferedReader in = new BufferedReader(new StringReader (text));//bigString是要处理的大字段值
		        char[] c = new char[1024];
		        int read=0;
		        while ((read=in.read(c))!=-1) {
		        	writer.write(c,0,read);
		        }
				writer.flush();
				writer.close();
				result = true;
			}
			if(isCommit)//是否提交
				con.commit();
		}catch(Exception e)
		{
			error=true;//异常状态
			result=false;
			e.printStackTrace();
		}finally{
			if(isClose || error)
				closeAll();
			else
				close();
		}
		return result;
	}
	/**
	 * 创建BLOB
	 * @param conn 数据库链接
	 * @param o 数据对象
	 * @return BLOB
	 * @throws Exception
	 */
	private BLOB createBlob(Connection conn,Object o) throws Exception{
		//注意：如果出现错误“无法从套接字读取更多的数据”，
		//解决办法：将Oracle9i的JAR包换成Oracle10g的JAR包即可（我用的是ojdbc14.jar,1.29M,注意大小哦）
		BLOB blob=BLOB.createTemporary(conn, true, CLOB.DURATION_SESSION);
		if(o instanceof byte[]){
			blob.putBytes(1, (byte[])o);
		}else if(o instanceof InputStream){
			blob.open(BLOB.MODE_READWRITE);
			OracleBlobOutputStream os=(OracleBlobOutputStream) blob.getBinaryOutputStream();
			InputStream is=(InputStream)o;
	        byte[] b = new byte[1024];
	        int read=0;
	        while ((read=is.read(b))!=-1) {
	        	os.write(b,0,read);
	        }
			os.flush();
			os.close();
			os=null;
			is.close();
			is=null;
		}else if(o instanceof File){
			blob.open(BLOB.MODE_READWRITE);
			OracleBlobOutputStream os=(OracleBlobOutputStream) blob.getBinaryOutputStream();
			File file=(File)o;
			InputStream is=new FileInputStream(file);
	        byte[] b = new byte[1024];
	        int read=0;
	        while ((read=is.read(b))!=-1) {
	        	os.write(b,0,read);
	        }
			os.flush();
			os.close();
			os=null;
			is.close();
			is=null;
		}else{//数据类型不符
			throw new Exception("Exception BLOB Object type not!");
		}
		return blob;
	}
	/**
	 * 创建CLOB
	 * @param conn 数据库链接
	 * @param o 数据对象
	 * @return CLOB
	 * @throws Exception
	 */
	private CLOB createClob(Connection conn,Object o) throws Exception{
		//注意：如果出现错误“无法从套接字读取更多的数据”，
		//解决办法：将Oracle9i的JAR包换成Oracle10g的JAR包即可（我用的是ojdbc14.jar,1.29M,注意大小哦）
		CLOB clob=CLOB.createTemporary(conn, true, CLOB.DURATION_SESSION);
		if(o instanceof String){
			clob.putString(1, (String)o);
		}else if(o instanceof char[]){
			clob.putChars(1, (char[])o);
		}else if(o instanceof Reader){
			clob.open(CLOB.MODE_READWRITE);
			oracle.jdbc.driver.OracleClobWriter writer=(OracleClobWriter) clob.getCharacterOutputStream();
			//InputStreamReader reader=new InputStreamReader("");
			Reader reader=(Reader)o;
	        char[] c = new char[1024];
	        int read=0;
	        while ((read=reader.read(c))!=-1) {
	        	writer.write(c,0,read);
	        }
			writer.flush();
			writer.close();
		}else{//数据类型不符
			throw new Exception("Exception CLOB Object type not!");
		}
		return clob;
	}
    /**
     * 该方法主要作用为：相应的对象类型匹配相应的参数类型
     * 
     * @param ps PreparedStatement
     * @param index 参数位置
     * @param ojb 对应位置所要传递的对象
     * @param sqlType 数据类型
     */
	private void statementSet(PreparedStatement ps,int index,Object ojb,int sqlType)throws Exception
	{
        switch (sqlType) {

        case Types.NUMERIC:
        case Types.DECIMAL:
        	ps.setBigDecimal(index, (java.math.BigDecimal)ojb);
            break;
            
        case Types.BIT:
        	ps.setBoolean(index, (Boolean)ojb);
            break;
            
        case Types.TINYINT:
        	ps.setByte(index, (Byte)ojb);
            break;

        case Types.SMALLINT:
        	ps.setShort(index, (Short)ojb);
            break;

        case Types.INTEGER:
        	ps.setInt(index, (Integer)ojb);
            break;

        case Types.BIGINT:
        	ps.setLong(index, (Long)ojb);
            break;

        case Types.REAL:
        	ps.setFloat(index, (Float)ojb);
            break;

        case Types.FLOAT:
        case Types.DOUBLE:
        	ps.setDouble(index, (Double)ojb);
            break;
			
        case Types.BINARY:
        case Types.VARBINARY:
        case Types.LONGVARBINARY:
        	ps.setBytes(index, (byte[])ojb);
            break;

        case Types.DATE:
        	ps.setDate(index, new java.sql.Date(((java.util.Date)ojb).getTime()));
            break;

        case Types.TIME:
        	ps.setTime(index, (java.sql.Time)ojb);
            break;
            
        case Types.TIMESTAMP:
        	ps.setTimestamp(index, (java.sql.Timestamp)ojb);
            break;
            
        case Types.BLOB:
        	ps.setBlob(index, createBlob(con,ojb));//BLOB大数据字段特殊处理
            break;

        case Types.CLOB:
        	ps.setClob(index, createClob(con,ojb));//CLOB大数据字段特殊处理
            break;
            
        case Types.VARCHAR:
        	ps.setString(index, (String)ojb);
        	break;
        	
        case Types.OTHER:
        	ps.setObject(index, ojb);
        	break;
        	
        default:
        	ps.setString(index, (String)ojb);
        }
	}
	/**
	 * 存储过程参数赋值
	 * 
	 * @param ps CallableStatement
	 * @param index 索引
	 * @param ojb 参数值
	 * @param sqlType 数据类型
	 * @throws SQLException
	 */
	private void callableSet(CallableStatement ps,int index,Object ojb,int sqlType)throws Exception
	{
        switch (sqlType) {

        case Types.NUMERIC:
        case Types.DECIMAL:
        	ps.setBigDecimal(index, (java.math.BigDecimal)ojb);
            break;
            
        case Types.BIT:
        	ps.setBoolean(index, (Boolean)ojb);
            break;
            
        case Types.TINYINT:
        	ps.setByte(index, (Byte)ojb);
            break;

        case Types.SMALLINT:
        	ps.setShort(index, (Short)ojb);
            break;

        case Types.INTEGER:
        	ps.setInt(index, (Integer)ojb);
            break;

        case Types.BIGINT:
        	ps.setLong(index, (Long)ojb);
            break;

        case Types.REAL:
        	ps.setFloat(index, (Float)ojb);
            break;

        case Types.FLOAT:
        case Types.DOUBLE:
        	ps.setDouble(index, (Double)ojb);
            break;
			
        case Types.BINARY:
        case Types.VARBINARY:
        case Types.LONGVARBINARY:
        	ps.setBytes(index, (byte[])ojb);
            break;

        case Types.DATE:
        	ps.setDate(index, new java.sql.Date(((java.util.Date)ojb).getTime()));
            break;

        case Types.TIME:
        	ps.setTime(index, (java.sql.Time)ojb);
            break;
            
        case Types.TIMESTAMP:
        	ps.setTimestamp(index, (java.sql.Timestamp)ojb);
            break;
            
        case Types.BLOB:
        	ps.setBlob(index, createBlob(con,ojb));//BLOB大数据字段特殊处理
            break;

        case Types.CLOB:
        	ps.setClob(index, createClob(con,ojb));//CLOB大数据字段特殊处理
            break;
            
        case Types.VARCHAR:
        	ps.setString(index, (String)ojb);
        	break;
        	
        case Types.OTHER:
        	ps.setObject(index, ojb);
        	break;
        	
        default:
        	ps.setString(index, (String)ojb);
        }
	}
	/**
	 * 调用存储过程
	 * @param callName 存储过程名
	 * @param body 字段数据
     * @param isPrint 是否打印SQL语句
     * @param isClose 执行后是否释放数据库链接
	 * @return 返回List结果集，List中所存储的对象为listToType
	 */
    public synchronized java.util.Vector<Object> getCall(String callName,CallParameterList body,boolean isPrint,boolean isClose){
		getConnection();
		if(con==null){
			closeAll();
			return null;
		}
		java.util.Vector<Object> list = null;
    	StringBuilder sql=new StringBuilder();
    	sql.append("{call ").append(callName).append("(");
    	if(body!=null){
			for(int i=0;i<body.size();i++)
			{
				if(i==0)
					sql.append("?");//加参数
				else
					sql.append(",?");//加参数
			}
    	}
		sql.append(")}");
		if(isPrint)
			System.out.println("call: "+sql.toString());
		try {
			CallableStatement callsta=con.prepareCall(sql.toString());
			if(body!=null){
				for(int i=1;i<=body.size();i++){
					CallParameter cp=body.get(i-1);
					if(cp.isOut()){
						//System.out.println("registerOutParameter("+i+","+cp.getValue()+")");
						callsta.registerOutParameter(i, cp.getOutType());
					}else{
						callableSet(callsta,i,cp.getValue(),cp.getInType());
					}
				}
			}
			callsta.execute();//提交请求
			//获得参数值
			if(body!=null && body.size()>0){
				list=new java.util.Vector<Object>();
				for(int i=1;i<=body.size();i++){
					CallParameter cp=body.get(i-1);
					if(cp.isOut()){//输出项
						if(cp.getOutType()==oracle.jdbc.driver.OracleTypes.NUMBER)
							list.add(callsta.getInt(i));
						else if(cp.getOutType()==oracle.jdbc.driver.OracleTypes.INTEGER)
							list.add(callsta.getInt(i));
						else if(cp.getOutType()==oracle.jdbc.driver.OracleTypes.VARCHAR)
							list.add(callsta.getString(i));
						else if(cp.getOutType()==oracle.jdbc.driver.OracleTypes.CURSOR){
							//获得返回结果集
							ResultSet rs = ((oracle.jdbc.driver.OracleCallableStatement) callsta).getCursor(i);
							list.add(getList(rs,cp.getListToType(),cp.isToString()));//获得数据
						}
					}
				}
			}
		} catch (Exception ex) {
			// TODO Auto-generated catch block
			error=true;//异常状态
			ex.printStackTrace();
		}finally{
			if(isClose || error)
				closeAll();
			else
				close();
		}
    	return list;
    }
    /**
     * 删除数据库中的数据
     * 
     * @param table 表名
     * @param where 查询条件
     * @param isPrint 是否打印SQL语句
     * @param isClose 执行后是释放数据库连接
     * @return boolean 返回执行后的结果
     */
    @java.lang.Deprecated
	public synchronized boolean delete(String table,String where,boolean isPrint,boolean isClose)
	{
		getConnection();
		if(con==null){
			closeAll();
			return false;
		}
		int result=0;
		try{
			StringBuilder sql=new StringBuilder();
			sql.append("delete from ").append(table).append(" where ").append(where);
			if(isPrint)//是否打印语句
				System.out.println("delete:"+sql);
			ps=con.prepareStatement(sql.toString(),ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
			result=ps.executeUpdate();
			if (result >= 1) 
				con.commit();//成功则提交
			else
				con.rollback();//失败则回滚
		}catch(Exception ex){
			error=true;//异常状态
			ex.printStackTrace();
		}finally{
			if(isClose || error)
				closeAll();
			else
				close();
		}
		return result >= 1;
	}
    /**
     * 删除数据库中的数据，数据回滚操作
     * 
     * @param table 表名
     * @param where 查询条件
     * @param isPrint 是否打印SQL语句
     * @param isCommit 是否提交事物
     * @param isClose 执行后是释放数据库连接
     * @return boolean 返回执行后的结果
     */
	public synchronized boolean delete(String table,String where,boolean isPrint,boolean isCommit,boolean isClose)
	{
		getConnection();
		if(con==null){
			closeAll();
			return false;
		}
		int result=0;
		try{
			StringBuilder sql=new StringBuilder();
			sql.append("delete from ").append(table).append(" where ").append(where);
			if(isPrint)//是否打印语句
				System.out.println("delete:"+sql);
			ps=con.prepareStatement(sql.toString(),ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
			result=ps.executeUpdate();
			if (result >= 1){
				if(isCommit)//是否提交事务
					con.commit();//成功则提交
			}
			else
				con.rollback();//失败则回滚
		}catch(Exception ex){
			error=true;//异常状态
			ex.printStackTrace();
		}finally{
			if(isClose && isCommit || error)
				closeAll();
			else
				close();
		}
		return result >= 1;
	}
	/**
	 * 事务提交
	 */
	public void commit(){
		try {
			if(con!=null)
				con.commit();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/**
	 * 事务回滚
	 */
	public void rollback(){
		try {
			if(con!=null)
				con.rollback();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/**
	 * 释放ps|rs链接
	 */
	private void close(){
		if(ps!=null){
			try{
				ps.close();ps=null;
			} catch (SQLException ex) {
	            ex.printStackTrace();
	        }
		}
		if(rs!=null){
			try{
				rs.close();rs=null;
			} catch (SQLException ex) {
	            ex.printStackTrace();
	        }
		}
	}
	/**
	 * 释放数据库链接
	 */
	public void closeAll(){
		close();
		if(con!=null){
			try{
				con.close();con=null;
			} catch (SQLException ex) {
	            ex.printStackTrace();
	        }
		}
	}

}